#!/usr/bin/env node

// 实际控制流程测试脚本
const { changePwmPin } = require('./lib/channel');
const { promisify } = require('util');
const { exec } = require('child_process');
const execAsync = promisify(exec);

console.log("🚗 实际控制流程测试");

async function testControlFlow() {
  console.log("\n🔧 测试实际控制流程...");
  
  try {
    // 测试gpio命令
    await execAsync('gpio -g mode 13 out');
    await execAsync('gpio -g mode 12 out');
    console.log("✅ 引脚初始化完成");
    
    // 模拟发送pwm 13 0.5命令
    console.log("📡 发送命令: changePwmPin(13, 0.5)");
    changePwmPin(13, 0.5);
    
    // 等待一段时间观察效果
    console.log("⏳ 等待2秒观察效果...");
    await new Promise(resolve => setTimeout(resolve, 2000));
    
    // 停止PWM信号
    console.log("📡 发送命令: changePwmPin(13, 0)");
    changePwmPin(13, 0);
    
    console.log("✅ 控制流程测试完成");
    return true;
  } catch (error) {
    console.error("❌ 控制流程测试失败:", error.message);
    return false;
  }
}

async function testDirectGPIO() {
  console.log("\n🔌 测试直接GPIO控制...");
  
  try {
    // 发送中性信号
    console.log("  发送中性信号 (1.5ms)...");
    await sendPWMSignal(13, 1.5, 1000);
    
    // 发送前进信号
    console.log("  发送前进信号 (1.7ms)...");
    await sendPWMSignal(13, 1.7, 2000);
    
    // 回到中性
    console.log("  回到中性信号...");
    await sendPWMSignal(13, 1.5, 1000);
    
    console.log("✅ 直接GPIO控制测试完成");
    return true;
  } catch (error) {
    console.error("❌ 直接GPIO控制测试失败:", error.message);
    return false;
  }
}

// 发送PWM信号的辅助函数
async function sendPWMSignal(pin, dutyCycleMs, durationMs) {
  const periodMs = 20; // 50Hz = 20ms周期
  const highTimeMs = dutyCycleMs;
  const lowTimeMs = periodMs - dutyCycleMs;
  
  const cycles = Math.floor(durationMs / periodMs);
  
  for (let i = 0; i < cycles; i++) {
    await execAsync(`gpio -g write ${pin} 1`);
    await sleep(highTimeMs);
    await execAsync(`gpio -g write ${pin} 0`);
    await sleep(lowTimeMs);
  }
}

// 精确延时函数（毫秒）
function sleep(ms) {
  return new Promise(resolve => {
    const start = Date.now();
    while (Date.now() - start < ms) {
      // 空循环等待
    }
    resolve();
  });
}

async function main() {
  console.log("🚀 开始实际控制流程测试");
  
  // 测试实际控制流程
  const controlSuccess = await testControlFlow();
  
  // 测试直接GPIO控制
  const gpioSuccess = await testDirectGPIO();
  
  console.log("\n📋 测试结果:");
  console.log(`  控制流程: ${controlSuccess ? '✅' : '❌'}`);
  console.log(`  直接GPIO: ${gpioSuccess ? '✅' : '❌'}`);
  
  if (controlSuccess && gpioSuccess) {
    console.log("\n🎉 所有测试通过！控制应该正常工作。");
  } else {
    console.log("\n⚠️  测试发现问题，请检查:");
    if (!controlSuccess) {
      console.log("   1. channel.js中的changePwmPin函数");
      console.log("   2. gpio.js进程通信");
    }
    if (!gpioSuccess) {
      console.log("   3. GPIO硬件连接");
      console.log("   4. 电调是否需要校准");
    }
  }
}

main();